/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package dao;
import bentity.beCoordenada;
import bentity.beIncidencia;
import bentity.beLineaMerma;
import bentity.beProducto;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Date;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author cesar
 */
public class daoIncidencia {
    public static final int E_INACTIVO =32;

    public int registrarIncidencia(beIncidencia incidencia) throws SQLException{
        Connection conn = daoHelper.dameConexion();
        int nextId =0;
        try {
            nextId = daoHelper.getNextId("INCIDENTE", "ID_INCIDENTE");
        } catch (Exception ex) {
            Logger.getLogger(daoIncidencia.class.getName()).log(Level.SEVERE, null, ex);
        }
        String sql = "INSERT INTO INCIDENTE (id_incidente,descripcion_Incidente, costo_Estimado_Danho, criticidad, tipo_Incidente,estadoincidente) VALUES (?,?,?,?,?,?)";
        PreparedStatement ps = conn.prepareStatement(sql);
        ps.setInt(1,nextId);
        ps.setString(2, incidencia.getDescrp_incidente());
        ps.setDouble(3, (double)incidencia.getCosto_estimado());
        ps.setInt(4, (int) incidencia.getCriticidad());
        ps.setInt(5, (int)incidencia.getTipo_incidente());
        ps.setInt(6,(int)incidencia.getEstado_incidencia());
        ps.executeUpdate();
        return nextId;
    }

    public int registrarIncidenciaxRack(beIncidencia incidencia) throws SQLException {
        Connection conn = null;
        PreparedStatement ps = null;

        String sql = "INSERT INTO INCIDENTE_X_RACK(ID_RACK,ID_INCIDENTE,FECHAINCIDENTE) VALUES ( ?,  ?, CURRENT_TIMESTAMP)";
        conn = daoHelper.dameConexion();
        ps = conn.prepareStatement(sql);
        int tipo = incidencia.getTipo_incidente();
        int id = incidencia.getIdIncidencia();
        Date fecha = incidencia.getFecha_incidente();
        ps.setInt(1,incidencia.getTipo_incidente());
        ps.setInt(2,incidencia.getIdIncidencia());
      //  ps.setDate(3,incidencia.getFecha_incidente());
        ps.executeUpdate();
        ps.close();
        conn.close();
        return daoHelper.TRANSACCION_EXITOSA;
      



    }

      public int registrarIncidenciaxPallet(beIncidencia incidencia,int estado) throws SQLException{
        Connection conn = daoHelper.dameConexion();
        String sql = "INSERT INTO INCIDENTE_X_PALLET(id_incidente,id_pallet,fechaIncidente,estado_inc_pal) VALUES (?,?,CURRENT_TIMESTAMP,?)";
        PreparedStatement ps = conn.prepareStatement(sql);
        ps.setInt(1,incidencia.getIdIncidencia());
        ps.setInt(2,incidencia.getTipo_incidente());
       // ps.setDate(3, (Date) incidencia.getFecha_incidente());
        ps.setInt(3,estado);
        ps.executeUpdate();
        ps.close();
        conn.close();
        return daoHelper.TRANSACCION_EXITOSA;
    }

    public int modificarIncidencia(beIncidencia incidencia) throws SQLException {
        Connection conn = daoHelper.dameConexion();
        String sql = "UPDATE INCIDENTE SET DESCRIPCION_INCIDENTE = ?,COSTO_ESTIMADO_DANHO = ?,CRITICIDAD = ?,TIPO_INCIDENTE = ? WHERE ID_INCIDENTE = ?";
        PreparedStatement ps = conn.prepareStatement(sql);
        ps.setString(1, incidencia.getDescrp_incidente());
        ps.setDouble(2, incidencia.getCosto_estimado());
        ps.setInt(3, incidencia.getCriticidad());
        ps.setInt(4, incidencia.getTipo_incidente());
        ps.setInt(5,incidencia.getIdIncidencia());
        ps.executeUpdate();
        ps.close();
        conn.close();
        return daoHelper.TRANSACCION_EXITOSA;
    }

    public int modificarIncidenciaxRack(beIncidencia incidencia) throws SQLException {
        Connection conn = daoHelper.dameConexion();
        String sql = "UPDATE INCIDENTE_X_RACK SET FECHAINCIDENTE = ? WHERE ID_INCIDENTE = ? AND ID_RACK = ?";
        PreparedStatement ps = conn.prepareStatement(sql);
        ps.setInt(1,incidencia.getTipo_incidente());
        ps.setDate(2, (Date)incidencia.getFecha_incidente());
        ps.executeUpdate();
        ps.close();
        conn.close();
        return daoHelper.TRANSACCION_EXITOSA;

    }

    public int modificarIncidenciaxPallet(beIncidencia incidencia) throws SQLException {
        Connection conn = daoHelper.dameConexion();
        String sql = "UPDATE INCIDENTE_X_PALLET SET FECHAINCIDENTE = ? WHERE ID_INCIDENTE = ? AND ID_PALLET = ?";
        PreparedStatement ps = conn.prepareStatement(sql);
        ps.setInt(1,incidencia.getTipo_incidente());
        ps.setDate(2, (Date)incidencia.getFecha_incidente());
        ps.executeUpdate();
        ps.close();
        conn.close();
        return daoHelper.TRANSACCION_EXITOSA;

    }

    public int eliminarIncidencia(beIncidencia incidencia) throws Exception{
            Connection conn = daoHelper.dameConexion();            
            String sql = "UPDATE INCIDENTE SET ESTADOINCIDENTE = 32 WHERE ID_INCIDENTE = ?";
            PreparedStatement ps = conn.prepareStatement(sql);
            ps.setInt(1, incidencia.getIdIncidencia());
            ps.executeUpdate();
            ps.close();
            conn.close();
            return daoHelper.TRANSACCION_EXITOSA;
    }

    public int eliminarIncidenciaRack(beIncidencia incidencia) throws Exception{
            Connection conn = daoHelper.dameConexion();
            String sql = "DELETE FROM INCIDENTE_X_RACK WHERE ID_INCIDENTE = ? AND ID_RACK = ?";
            PreparedStatement ps = conn.prepareStatement(sql);
            ps.executeUpdate();
            ps.close();
            conn.close();
            return daoHelper.TRANSACCION_EXITOSA;

    }
    public int eliminarIncidenciaPallet(beIncidencia incidencia) throws Exception{
            Connection conn = daoHelper.dameConexion();
            String sql = "DELETE FROM INCIDENTE_X_PALLET WHERE ID_INCIDENTE = ? AND ID_PALLET = ?";
            PreparedStatement ps = conn.prepareStatement(sql);
            ps.executeUpdate();
            ps.close();
            conn.close();
            return daoHelper.TRANSACCION_EXITOSA;

    }

      public ArrayList<beIncidencia> queryIncidenciasByFilters(String strCodIncidente,String descripcion, String strCriticidad,String strCosto,int tipo,int estado) throws Exception {
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        String sql =null;
        int []contador = new int[6];
        int codIncidente = 0;
        double costo =0.0;        
        int entCriticidad = 0;


        sql = "SELECT ID_INCIDENTE, DESCRIPCION_INCIDENTE, COSTO_ESTIMADO_DANHO, CRITICIDAD,TIPO_INCIDENTE,ESTADOINCIDENTE FROM INCIDENTE WHERE ESTADOINCIDENTE = ?";
        contador[0] = 1;
        if (!String.valueOf(strCodIncidente).isEmpty()){
            sql += " AND ID_INCIDENTE = ? ";
            codIncidente = Integer.parseInt(strCodIncidente);
            contador[1] = 1;
        }

       
        if (!String.valueOf(descripcion).isEmpty()){
            
             sql += " AND DESCRIPCION_INCIDENTE LIKE '%'||?||'%' ";
            
            contador[2] = 1;
        }

        if (!String.valueOf(strCosto).isEmpty()){
             sql += " AND COSTO_ESTIMADO_DANHO = ? ";
             costo = Double.parseDouble(strCosto);
             contador[3] = 1;
        }

        if (String.valueOf(strCriticidad).compareTo(" ")!= 0){
             sql += " AND CRITICIDAD = ? ";
             if (strCriticidad.compareTo("Bajo")== 0){
              entCriticidad = 34;
              }
              else {
                if (strCriticidad.compareTo("Medio")== 0)
                entCriticidad = 35;
                else {
                   if (strCriticidad.compareTo("Alto")== 0)
                    entCriticidad = 36;
                }
              }
            contador[4] = 1;
        }

        if (tipo != 0){
       
             sql += " AND TIPO_INCIDENTE = ? ";
             contador[5] = 1;
        }


        sql += " ORDER BY ID_INCIDENTE ";
        conn = daoHelper.dameConexion();
        ps = conn.prepareStatement(sql);
        int j=0;
        for(int i=0; i<6; i++){
            if (contador[i]==1){
                j++;
                switch (i){
                    case 0:
                        ps.setInt(j,estado);
                        break;
                   
                    case 1:
                        ps.setInt(j,codIncidente);
                        break;
                  
                    case 2:
                        ps.setString(j,descripcion);
                        break;
                    case 3:
                        ps.setDouble(j,costo);
                        break;
                    case 4:
                        ps.setInt(j,entCriticidad);
                        break;
                    case 5:
                        ps.setInt(j,tipo);
                        break;
                 
                }
            }
        }
        rs= ps.executeQuery();
        ArrayList<beIncidencia> incidencias = new ArrayList<beIncidencia>();
        beIncidencia i = null;
        while (rs.next()){
            i = new beIncidencia(rs.getInt(1),rs.getString(2),rs.getDouble(3),rs.getInt(4),rs.getInt(5));
            incidencias.add(i);
        }
        rs.close();
        ps.close();
        conn.close();
        return incidencias;
    }

public ArrayList<beProducto> getProducto() throws SQLException{
        ArrayList<beProducto> productos = new ArrayList<beProducto>();
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        beProducto p;
        String sql = "SELECT * FROM PRODUCTO ";
        conn = daoHelper.dameConexion();
        ps = conn.prepareStatement(sql);
        rs = ps.executeQuery();
       while (rs.next()) {
            p = new beProducto(rs.getInt(1), rs.getString(2), rs.getString(3), rs.getDouble(4), rs.getInt(5), rs.getInt(6));
            productos.add(p);
       }
       rs.close();
       ps.close();
       conn.close();
       return productos;

}

public String getTipo_Incidente(int tipo) throws SQLException{
     Connection conn = daoHelper.dameConexion();
     ResultSet rs = null;
     String nombre_dato =null;
     String sql = "SELECT NOMBRE_DATO FROM DATOS_COMBO WHERE ID_DATO =?";
     PreparedStatement ps = conn.prepareStatement(sql);
     ps.setInt(1, tipo);
     rs = ps.executeQuery();
     rs.next();
     nombre_dato = rs.getString(1);
     rs.close();
     ps.close();
     conn.close();
     return nombre_dato;

}

public int busquedaProductosPorNombre(String cadBusqueda) throws Exception{
        ArrayList<beProducto> productos = new ArrayList<beProducto>();
        beProducto p = null;
        Connection conn = daoHelper.dameConexion();
        String sql = "SELECT * FROM PRODUCTO WHERE NOMBRE LIKE '%'||?||'%' ";
        PreparedStatement ps = conn.prepareStatement(sql);
        ps.setString(1,cadBusqueda);
        ResultSet rs = ps.executeQuery();
        while (rs.next()){
            p = new beProducto(rs.getInt(1),rs.getString(2),rs.getString(3),rs.getDouble(4),rs.getInt(5),rs.getInt(6));
            productos.add(p);
        }
        rs.close();
        ps.close();
        conn.close();
        return productos.get(0).getIdProducto();
    }

public ArrayList<Integer> getEstado() throws SQLException{
     Connection conn = daoHelper.dameConexion();
     ResultSet rs = null;
     ArrayList<Integer> estados = new ArrayList<Integer>();
     String sql = "SELECT ID_DATO FROM DATOS_COMBO WHERE NOMBRE_COMBO = 'ESINCI'";
     PreparedStatement ps = conn.prepareStatement(sql);
     rs = ps.executeQuery();
     while (rs.next()){
         estados.add(rs.getInt(1));
    }
     rs.close();
     ps.close();
     conn.close();
     return estados;


}

public boolean validarDependencias(int id) throws Exception{
        Connection conn = daoHelper.dameConexion();
        String sql = "SELECT COUNT(*) AS CONTEO FROM INCIDENTE_X_RACK WHERE ID_INCIDENTE = ? ";
        PreparedStatement ps = conn.prepareStatement(sql);
        ps.setInt(1,id);
        ResultSet rs = ps.executeQuery();
        rs.next();
        int conteo = rs.getInt(1);
        sql = "SELECT COUNT(*) AS CONTEO FROM INCIDENTE_X_PALLET WHERE ID_INCIDENTE = ? AND ESTADO_INC_PAL <> ?";
        ps = conn.prepareStatement(sql);
        ps.setInt(1,id);
        ps.setInt(2,E_INACTIVO);
        rs = ps.executeQuery();
        rs.next();
        int conteo1 = rs.getInt(1) + conteo;
        rs.close();
        ps.close();
        conn.close();
        return (conteo1 > 0);
    }

public ArrayList<String> getCriticidad() throws SQLException {
     Connection conn = daoHelper.dameConexion();
     ResultSet rs = null;
     ArrayList<String> estados = new ArrayList<String>();
     String sql = "SELECT NOMBRE_DATO FROM DATOS_COMBO WHERE NOMBRE_COMBO = 'CRINCI'";
     PreparedStatement ps = conn.prepareStatement(sql);
     rs = ps.executeQuery();
     while (rs.next()){
         estados.add(rs.getString(1));
    }
     rs.close();
     ps.close();
     conn.close();
     return estados;

}

 public int eliminarI(int idPallet, int idIncidente) throws SQLException{
     Connection conn = daoHelper.dameConexion();
     String sql = "UPDATE INCIDENTE_X_PALLET SET ESTADO_INC_PAL = ? WHERE ID_PALLET = ?";
     PreparedStatement ps = conn.prepareStatement(sql);
     ps.setInt(1,E_INACTIVO);
    // ps.setInt(2, idIncidente);
     ps.setInt(2, idPallet);
     ps.executeUpdate();
     ps.close();
     conn.close();
     return daoHelper.TRANSACCION_EXITOSA;

    }

  public boolean estaIncidencia(int codIncidente,int idTipo,String tipo) throws SQLException{

     Connection conn = daoHelper.dameConexion();
     String sql = null;
     int ind = 1;

     if (tipo.compareTo("Rack")== 0)
       sql = "SELECT COUNT(*) AS CONTEO FROM INCIDENTE_X_RACK WHERE ID_INCIDENTE = ?  AND ID_RACK = ?";
     else {
       sql = "SELECT COUNT(*) AS CONTEO FROM INCIDENTE_X_PALLET WHERE ID_INCIDENTE = ?  AND ID_PALLET = ? AND ESTADO_INC_PAL <> ?";
       ind = 0;
     }
     PreparedStatement ps = conn.prepareStatement(sql);
     ps.setInt(1,codIncidente);
     ps.setInt(2,idTipo);
     if (ind == 0)
      ps.setInt(3,E_INACTIVO);
     ResultSet rs = ps.executeQuery();
     rs.next();
     int conteo = rs.getInt(1);
     ps.close();
     conn.close();
     return (conteo == 0);

    }


   public ArrayList<beLineaMerma> obtenerLineaMerma(String Prod,String Motivo,String strSalidaDesde,String strSalidaHasta) throws SQLException{
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        String sql =null;
        ArrayList<beLineaMerma> linea = new ArrayList<beLineaMerma>();
        int []contador = new int[4];
        sql = "SELECT UP.MOTIVO,UP.FECHASALIDA,PR.NOMBRE,P.ID_PALLET,U.NUMERO_PISO,U.NUMERO_UBICACION,R.NUMERO_FILA, R.NUMERO_RACK,R.ID_RACK,P.CANTIDAD_CAJAS  FROM UBICACION_X_PALLET UP, PALLET P,PRODUCTO PR,RACK R,UBICACION U WHERE P.ID_PALLET = UP.ID_PALLET AND U.ID_UBICACION = UP.ID_UBICACION AND R.ID_RACK = U.ID_RACK AND P.ID_PRODUCTO = PR.ID_PRODUCTO";

        conn = daoHelper.dameConexion();
        ps = conn.prepareStatement(sql);

        if (!String.valueOf(Prod).isEmpty()){
            sql += " AND PR.NOMBRE LIKE '%'||?||'%'";
            contador[0] = 1;
        }


        if (Motivo.compareTo(" ")!= 0){
            sql += " AND UP.MOTIVO = ?";
            contador[1] = 1;
        }

        if (!String.valueOf(strSalidaDesde).isEmpty()){
            sql += " AND UP.FECHASALIDA >= CAST( ? AS DATE ) ";
            contador[2] = 1;
        }


        if (!String.valueOf(strSalidaHasta).isEmpty()){
             sql += " AND UP.FECHASALIDA <= CAST( ? AS DATE) ";
             contador[3] = 1;
        }


        sql += " ORDER BY UP.FECHASALIDA ";
        conn = daoHelper.dameConexion();
        ps = conn.prepareStatement(sql);
        int j=0;
        for(int i=0; i<4; i++){
            if (contador[i]==1){
                j++;
                switch (i){
                    case 0:
                        ps.setString(j,Prod);
                        break;

                    case 1:
                        ps.setString(j,Motivo);
                        break;

                    case 2:
                        ps.setString(j,strSalidaDesde);
                        break;
                    case 3:
                        ps.setString(j,strSalidaHasta);
                        break;

                }
            }
        }
        rs= ps.executeQuery();
        
        while (rs.next()){
            beLineaMerma l = new beLineaMerma();
            l.setFecha(rs.getTimestamp(2));
            l.setMotivo(rs.getString(1));
            l.setProducto(rs.getString(3));
            l.setId_Pallet(rs.getInt(4));
            l.setId_Rack(rs.getInt(9));
            l.setCantidad(rs.getInt(10));
            beCoordenada c = new beCoordenada();
            c.setFila(rs.getInt(7));
            c.setRack(rs.getInt(8));
            c.setUbicacion(rs.getInt(6));
            c.setPiso(rs.getInt(5));
            l.setCoordenada(c);
            linea.add(l);
        }
        rs.close();
        ps.close();
        conn.close();
        ArrayList<beLineaMerma> linea1 = new ArrayList<beLineaMerma>();
        for (int i = 0;i<linea.size();i++){
            if(linea.get(i).getMotivo().compareTo("Incidente")== 0 || linea.get(i).getMotivo().compareTo("Vencimiento")==0) {
                beLineaMerma l = new beLineaMerma();
                l.setFecha(linea.get(i).getFecha());
                l.setMotivo(linea.get(i).getMotivo());
                l.setCantidad(linea.get(i).getCantidad());
                l.setProducto(linea.get(i).getProducto());
                l.setId_Pallet(linea.get(i).getId_Pallet());
                l.setId_Rack(linea.get(i).getId_Rack());
                l.setCoordenada(linea.get(i).getCoordenada());
                linea1.add(l);
            }
        }

        return linea1;

    }




}
